package com.talkweb.ncfw.security.permission;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.talkweb.ncfw.data.IUserSession;
import com.talkweb.ncfw.utils.StringUtils;

/**
 * <p>文件名称: DefaultFuncPermissionRevoler.java</p>
 * <p>文件描述: 本类描述</p>
 * <p>版权所有: 版权所有(C)2010</p>
 * <p>内容摘要: 简要描述本文件的内容，包括主要模块、函数及能的说明</p>
 * <p>其他说明: 其它内容的说明</p>
 * <p>完成日期: 2011-10-23</p>
 * <p>修改记录1:</p>
 * <pre>
 *    修改日期:
 *    修 改 人:
 *    修改内容:
 * </pre>
 * <p>修改记录2：…</p>
 * @author  Wuqingming
 */
public class DefaultFuncPermissionRevoler implements IFuncPermissionResolver {
	private static final Log log = LogFactory.getLog(DefaultFuncPermissionRevoler.class);
	private IFuncPermissionStore funcPermissionStore;
	
	public IFuncPermissionStore getFuncPermissionStore() {
		return funcPermissionStore;
	}
	
	public void setFuncPermissionStore(IFuncPermissionStore funcPermissionStore) {
		this.funcPermissionStore = funcPermissionStore;
	}

	public boolean hasFuncPermission(IUserSession userSession, String funccode) {
		if (funcPermissionStore == null) {
			return false;
		}
		if (StringUtils.isEmpty(funccode)) {
			return false;
		}
		FuncPermission funcPermission = this.funcPermissionStore.getFuncPermission(funccode);
		if (funcPermission == null) {//不存在该功能许可
			log.warn("不存在此功能许可, 功能编号为:" + funccode);
			return false;
		}
		if (funcPermission.isOpenAllUser()) {//对所有人开放
			return true;
		}
		List<String> permissionRoles = funcPermission.getRoles();
		if (permissionRoles == null || permissionRoles.size() == 0) {
			log.info("功能编号为: [" + funccode + "]的功能尚未对外开放.");
			return false;
		}
		if (userSession == null) {
			log.warn("用户未登录, 访问的功能编号为:" + funccode);
			return false;
		}
		String[] userRoles = userSession.getRoles();
		if (userRoles == null || userRoles.length == 0) {
			log.info("登录ID为" + userSession.getLoginid() + "的用户未分配角色权限.");
			return false;
		}
		for (String userRole : userRoles) {
			for (String permissionRole : permissionRoles) {
				if (StringUtils.equals(userRole, permissionRole)) {
					return true;
				}
			}
		}
		return false;
	}

}

